[Alexaスキル] AudioPlayerでハローワールド
渡辺です。
Alexaでは、AudioPlayerを利用することで、音楽再生スキルを作成できます。 今回はAudioPlayerの最低限の機能を実装することで、AudioPlayerの概要を掴みましょう。
AudioPlayerの有効化
はじめに、AudioPlayer機能を利用するには、開発者コンソールでスキルのAudioPlayer機能を有効にします。
対話モデル
音楽再生スキルの対話モデルは、通常のカスタムスキルと変わりません。
ただし、必須インテントのAMAZON.PauseIntent
とAMAZON.ResumeIntent
を含めなければなりません。
AMAZON.PauseIntent
は音楽再生の一時停止、AMAZON.ResumeIntent
は音楽再生の再開を意図するインテントです。
必須インテントに加え、起動インテントとなるAMAZON.StartOverIntent
、およびに音楽再生のトリガーとなるPlayIntent
を追加すると、次のような対話モデルとなります。
{ "interactionModel": { "languageModel": { "invocationName": "音楽再生", "intents": [ { "name": "AMAZON.StartOverIntent" }, { "name": "AMAZON.PauseIntent" }, { "name": "AMAZON.ResumeIntent" }, { "name": "PlayIntent", "samples": [ "音楽をかけて", "音楽を流して", "音楽を再生して" ] } ] } } }
なお、組み込みインテントは、サンプル発話は省略できます。
Playディレクティブ
AudioPlayerで音楽を再生することは簡単です。 クライアント(Echo端末)に対し、Playディレクティブを送信します。
雑に言えば、ディレクティブとは、Lambda(クラウド)側からクライアントへのアクションを指定することです。 LambdaからJSONオブジェクトを返すことでPlayディレクティブを送信しますが、SDKを利用していれば、audioPlayerPlayメソッドを実行するだけです。 具体的には、PlayIntentで次のように、audioPlayerPlayメソッドを実行します。
'PlayIntent': function () { this.response.audioPlayerPlay('REPLACE_ALL', url, url, null, 0); this.emit(':responseReady'); },
再生時にAlexaに喋らせる場合は speakメソッドも併用してください。
'PlayIntent': function () { const output = this.t('PLAYING'); this.response.speak(output).audioPlayerPlay('REPLACE_ALL', url, url, null, 0); this.emit(':responseReady'); },
urlには、再生する音楽ファイルのあるURLを指定します。
PauseIntentとResumeIntentに対応する
続けて、必須インテントのAMAZON.PauseIntent
とAMAZON.ResumeIntent
のハンドラを追加します。
それぞれ、StopディレクティブとPlayディレクティブを送信するため、audioPlayerStopメソッドとaudioPlayerPlayメソッドを実行します。
'AMAZON.PauseIntent': function () { this.response.speak(text).audioPlayerStop(); this.emit(':responseReady'); }, 'AMAZON.ResumeIntent': function () { this.response.audioPlayerPlay('REPLACE_ALL', url, url, null, 0); this.emit(':responseReady'); }
PauseIntentは、音楽再生後「Alexa、一時停止」のように話しかけると起動するハンドラとなります。 その後、「Alexa、再開」のように話しかければResumeIntentが呼び出されます。
イベントの処理
AudioPlayerを有効にすると、音楽の再生開始時や終了時などにイベントをクラウド(Lambda)側に送信し、処理を行うことができます。 具体的には、次のイベントが発生します。
- PlaybackStarted
- PlaybackFinished
- PlaybackStopped
- PlaybackNearlyFinished
- PlaybackFailed
特に処理が不要であれば、処理を実装しなくても良いのですが、イベントは発生します。 イベントが発生した時、対応するハンドラがないと、Lambdaにエラーが発生してしまいます。 次のように空の処理を実装しておくと良いでしょう。
他のインテントと同様にハンドラを定義してください。
// 再生開始時 'PlaybackStarted': function () { this.emit(':responseReady'); }, // 再生終了時 'PlaybackFinished': function () { this.emit(':responseReady'); }, // 再生停止時 'PlaybackStopped': function () { this.emit(':responseReady'); }, // 再生終了が近い時 'PlaybackNearlyFinished': function () { this.emit(':responseReady'); }, // 再生失敗時 'PlaybackFailed': function () { this.emit(':responseReady'); },
以上が音楽再生スキルとしては最低必要となるハンドラです。
まとめ
音楽再生スキルを作るには、AudioPlayerの機能を有効にします。 音楽再生のインテント、及びに一時停止と再生再開のインテントを追加してください。 それぞれのインテントでは再生する音楽ファイルのURLを指定し、PlayディレクティブやStopディレクティブを送信します。
また、AudioPlayerを有効にするとインテントとは別にイベントが発生します。 イベントを処理するハンドラも合わせて定義してください。
以上で音楽再生スキルのベースが出来ました。 実用レベルのスキルにするには、複数の音源から適切なファイルを選択したり、リピート再生に対応したり、要件に合わせた機能を追加する必要があります。